home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / dsp / dspgroup / macrosrc.arc / LET.ASM < prev    next >
Encoding:
Assembly Source File  |  1983-11-17  |  5.9 KB  |  229 lines

  1.  
  2. *LET MACRO -- INTEGER COMPUTATIONS
  3. *      LET  LET-EXPR
  4. *      LET-EXPR:=A|A,OP,B
  5. *      A:=(LET-EXPR)|CONSTANT|SYMBOLIC RAM LOC LABEL|EMPTY
  6. *           IF AA IS EMPTY, MEANS VALUE IN THE AC
  7. *           (CONTINUATION FROM PREVIOUS LET)
  8. *      B:=(LET-EXPR)|CONSTANT|SYMBOLIC RAM LOC LABEL
  9. *      OP:=+|-|/|*|&|##|--|//|LT|GT|EQ|LE|GE|NE|^
  10. *           ADD -> +     LESS THAN ------------> LT
  11. *           SUB -> -     GREATER THAN ---------> GT
  12. *           DIV -> /     EQUAL ----------------> EQ
  13. *           MPY -> *     LESS THAN OR EQUAL ---> LE
  14. *           AND -> &     GREATER THAN OR EQUAL-> GE
  15. *           XOR -> ##    NOT EQUAL ------------> NE
  16. *           OR  -> ++
  17. *           MOD -> //    SHIFT -> ^
  18.  
  19.        COPY MACROS.LCAC
  20.  
  21. LET    $MACRO  A,OP,B
  22.        $VAR T,S,SF,ST,DB,NS,SZ
  23.        $ASG '$$STSZ' TO SZ.S
  24.        $ASG '$$STAR' TO NS.S
  25.        $ASG '^' TO SF.S
  26.        $IF  A.L#=0
  27.        $IF  A.A&$POPL
  28.        LET  :A:
  29.        $ELSE
  30.        $IF A.SA&$UNDF
  31.        $IF  OP.SV=SF.SV
  32.        LCAC :A:,:B:
  33.        $ELSE
  34.        LCAC :A:
  35.        $ENDIF
  36.        $ELSE
  37.        $IF  OP.SV=SF.SV
  38.        LAC  :A:,:B:
  39.        $ELSE
  40.        LAC  :A:,0
  41.        $ENDIF
  42.        $ENDIF
  43.        $ENDIF
  44.        $ENDIF
  45.        $IF  (OP.L#=0)&(OP.SV#=SF.SV)
  46.        $ASG '$$STSL' TO ST.S
  47.        $ASG 1 TO S.V
  48.        $ASG 0 TO DB.V
  49.        $ASG '+' TO T.S
  50.        $IF  OP.SV=T.SV
  51.        $ASG 1 TO DB.V
  52.        $ENDIF
  53.        $ASG '-' TO T.S
  54.        $IF  OP.SV=T.SV
  55.        $ASG 1 TO DB.V
  56.        $ENDIF
  57.        $ASG '/' TO T.S
  58.        $IF  OP.SV=T.SV
  59.        $ASG 1 TO DB.V
  60.        $ENDIF
  61.        $ASG '//' TO T.S
  62.        $IF  OP.SV=T.SV
  63.        $ASG 1 TO DB.V
  64.        $ENDIF
  65.        $IF  B.A&$POPL
  66.        $IF  ST.SV=0
  67.        $IF  NS.SV<0
  68.        LARK AR1,LETST$   LOAD STACK POINTR
  69.        LARP AR1
  70.        $ENDIF
  71.        $ENDIF
  72.        $ASG ST.SV+1 TO ST.SV
  73.        MAR  *+
  74.        $IF  DB.V
  75.        SACH *+,0
  76.        $ASG ST.SV+1 TO ST.SV
  77.        $ENDIF
  78.        SACL *,0
  79.        $IF  SZ.SV<ST.SV
  80.  ERROR ***LETSET stack size of :ST.SV: is req'd***
  81.        $ENDIF
  82.        LET  :B:
  83.        $ASG ST.SV-1 TO ST.SV
  84.        $IF  DB.V
  85.        $ASG ST.SV-1 TO ST.SV
  86.        $ELSE
  87.        $IF  B.SA&$UNDF
  88.        $IF  ST.SV=0
  89.        $IF  NS.SV<0
  90.        LARK AR1,LETST$   LOAD STACK POINTR
  91.        LARP AR1
  92.        $ENDIF
  93.        $ENDIF
  94.        MAR  *+
  95.        $IF  DB.V
  96.        SACH *+,0
  97.        SACL *,0
  98.        $IF  SZ.SV<2
  99.  ERROR ***LETSET stack size of 2 is req'd***
  100.        $ENDIF
  101.        $ELSE
  102.        SACL *,0
  103.        $IF  SZ.SV<1
  104.  ERROR ***LETSET stack size of 1 is req'd***
  105.        $ENDIF
  106.        $ENDIF
  107.        LCAC :B:
  108.        $ELSE
  109.        $ASG 0 TO S.V         LITRAL SECOND OPERND
  110.        $ASG '+' TO T.S
  111.        $IF  OP.SV=T.SV
  112.        ADD  :B:,0             +
  113.        $ENDIF
  114.        $ASG '-' TO T.S
  115.        $IF  OP.SV=T.SV
  116.        SUB  :B:,0             -
  117.        $ENDIF
  118.        $ASG '*' TO T.S
  119.        $IF  OP.SV=T.SV
  120.        SACL XR0,0             SAVE AC
  121.        LT   XR0               LOAD T
  122.        MPY  :B:               *
  123.        PAC                    TO AC
  124.        $ENDIF
  125.        $ASG '/' TO T.S
  126.        $IF  OP.SV=T.SV
  127.        SACH DDV$0+0,0         SAVE AC HIGH
  128.        SACL DDV$0+1,0         SAVE AC LOW
  129.        LAC  :B:,0             LOAD :B:
  130.        SACL DDV$1,0           SAVE :B:
  131.        CALL DDV$              DIVIDE
  132.        $IF  NS.SV=0
  133.        LARP AR0
  134.        $ENDIF
  135.        LAC  DDV$2,0           LOAD QUOT
  136.        REF  DDV$,DDV$0,DDV$1,DDV$2,DDV$3
  137.        $ENDIF
  138.        $ASG '//' TO T.S
  139.        $IF  OP.SV=T.SV
  140.        SACH DDV$0+0,0         SAVE AC HIGH
  141.        SACL DDV$0+1,0         SAVE AC LOW
  142.        LAC  :B:,0             LOAD :B:
  143.        SACL DDV$1,0           SAVE :B:
  144.        CALL DDV$              DIVIDE
  145.        $IF  NS.SV=0
  146.        LARP AR0
  147.        $ENDIF
  148.        LAC  DDV$3,0           LOAD REM
  149.        REF  DDV$,DDV$0,DDV$1,DDV$2,DDV$3
  150.        $ENDIF
  151.        $ASG '&' TO T.S
  152.        $IF  OP.SV=T.SV
  153.        AND  :B:               AND
  154.        $ENDIF
  155.        $ASG '##' TO T.S
  156.        $IF  OP.SV=T.SV
  157.        XOR  :B:               XOR
  158.        $ENDIF
  159.        $ASG '++' TO T.S
  160.        $IF  OP.SV=T.SV
  161.        OR   :B:               OR
  162.        $ENDIF
  163.        $ENDIF
  164.        $ENDIF
  165.        $IF S.V               STACKD 1ST OPERND
  166.        $ASG '+' TO T.S
  167.        $IF  OP.SV=T.SV
  168.        ADDS *-
  169.        ADDH *-                +
  170.        $ENDIF
  171.        $ASG '-' TO T.S
  172.        $IF  OP.SV=T.SV
  173.        SACL XR0,0             SAVE SECOND
  174.        SACH XR1,0
  175.        ZALS *-                RELOAD FIRST
  176.        ADDH *-
  177.        SUBS XR0               1ST-2ND
  178.        SUBH XR1
  179.        $ENDIF
  180.        $ASG '/' TO T.S
  181.        $IF  OP.SV=T.SV
  182.        SACL DDV$1,0           SAVE 2ND
  183.        LAC  *-,0              LOAD
  184.        SACL DDV$0+1,0         SAVE LOW
  185.        LAC  *-,0              LOAD
  186.        SACL DDV$0+0,0         SAVE HIGH
  187.        CALL DDV$              DIVIDE
  188.        $IF  NS.SV=0
  189.        LARP AR0
  190.        $ENDIF
  191.        LAC  DDV$2,0           LOAD QUOT
  192.        REF  DDV$,DDV$0,DDV$1,DDV$2,DDV$3
  193.        $ENDIF
  194.        $ASG '//' TO T.S
  195.        $IF  OP.SV=T.SV
  196.        SACL DDV$1,0           SAVE 2ND
  197.        LAC  *-,0              LOAD
  198.        SACL DDV$0+1,0         SAVE LOW
  199.        LAC  *-,0              LOAD
  200.        SACH DDV$0+0,0         SAVE HIGH
  201.        CALL DDV$              DIVIDE
  202.        $IF  NS.SV=0
  203.        LARP AR0
  204.        $ENDIF
  205.        LAC  DDV$3,0           LOAD REM
  206.        REF  DDV$,DDV$0,DDV$1,DDV$2,DDV$3
  207.        $ENDIF
  208.        $ASG '*' TO T.S
  209.        $IF  OP.SV=T.SV
  210.        SACL XR0,0             GET 2ND
  211.        LT   XR0               TO T REG
  212.        MPY  *-                MPY BY STACK
  213.        PAC                    TO AC
  214.        $ENDIF
  215.        $ASG '&' TO T.S
  216.        $IF  OP.SV=T.SV
  217.        AND  *-                AND
  218.        $ENDIF
  219.        $ASG '##' TO T.S
  220.        $IF  OP.SV=T.SV
  221.        XOR  *-                XOR
  222.        $ENDIF
  223.        $ASG '++' TO T.S
  224.        $IF  OP.SV=T.SV
  225.        OR   *-                OR
  226.        $ENDIF
  227.        $ENDIF
  228.        $ENDIF
  229.        $END